package escenario;

import java.util.ArrayList;

import concurrencia.MonitorEspacio;

import sistemaDefensivo.BateriaDeMisiles;
import sistemaDefensivo.MisilDefensor;
import sistemaDefensivo.ServidorTerrestre;
import sistemaDefensivo.SistemaBateriaMisiles;
import sistemaDefensivo.SistemaDeRadar;
import sistemaEnemigo.GeneradorMisilesEnemigos;
import sistemaEnemigo.MisilEnemigo;

import escenario.Escenario;

public class Escenario {
	private ArrayList <BateriaDeMisiles> bateriaDeMisiles;
	private GeneradorMisilesEnemigos generadorMisilesEnemigos;

	private SistemaDeRadar radar;
	private ServidorTerrestre servidorTerrestre;
	private SistemaBateriaMisiles sistemaBateriaMisiles;
	private CollisionDetector collisionDetector;
	private MonitorEspacio monitorEspacio;

	public Escenario(){
		radar  = new SistemaDeRadar(this);
		servidorTerrestre = new ServidorTerrestre();
		sistemaBateriaMisiles = new SistemaBateriaMisiles(this);
		generadorMisilesEnemigos = new GeneradorMisilesEnemigos(this);
		bateriaDeMisiles = new ArrayList<BateriaDeMisiles>();
		collisionDetector = new CollisionDetector(this);
		monitorEspacio = new MonitorEspacio();
	}
	
	public void addMisilEnemigo(MisilEnemigo ME){
		monitorEspacio.addMisilEnemigo(ME);
	}
	
	public void addMisilDefensor(MisilDefensor MD){
		monitorEspacio.addMisilDefensor(MD);
	}
	
	public void addPosEnemigo(IdPosicion PE){
		monitorEspacio.addPosEnemigo(PE);
	}
	
	public void addPosDefensor(IdPosicion PD){
		monitorEspacio.addPosDefensor(PD);
	}
	
	public void setPosEnemigo(int id, double x, double y, double z, double xDest, double yDest, double zDest){
		monitorEspacio.setPosEnemigo(id, x, y, z, xDest, yDest, zDest);		
	}
	
	public void setPosDefensor(int id, double x, double y, double z, double xDest, double yDest, double zDest){
		monitorEspacio.setPosDefensor(id, x, y, z, xDest, yDest, zDest);		
	}
	
	public IdPosicion getPosEnemigo(int pos){
		return monitorEspacio.getPosEnemigo(pos);
	}

	public int getSizeArrayPosEnemigos(){
		return  monitorEspacio.getSizeposEnemigos();
	}

	public void removePosEnemigo(int id){
        monitorEspacio.removePosEnemigo(id);
	}

	public void removePosDefensor(int id){
        monitorEspacio.removePosDefensor(id);
	}
	
	public void removeMisilEnemigo(MisilEnemigo ME){
        monitorEspacio.removeMisilEnemigo(ME);
	}

	public void removeMisilDefensor(MisilDefensor MD){
        monitorEspacio.removeMisilDefensor(MD);
	}
	
	public void addBateriaDeMisiles(BateriaDeMisiles bateriaDeMisiles) {
		this.bateriaDeMisiles.add(bateriaDeMisiles);
	}
		
	public BateriaDeMisiles getBateriaDeMisiles(int pos) {
		return bateriaDeMisiles.get(pos);
	}

	public GeneradorMisilesEnemigos getGeneradorMisilesEnemigos() {
		return generadorMisilesEnemigos;
	}

	public SistemaDeRadar getRadar() {
		return radar;
	}

	public ServidorTerrestre getServidorTerrestre() {
		return servidorTerrestre;
	}

	public SistemaBateriaMisiles getSistemaBateriaMisiles() {
		return sistemaBateriaMisiles;
	}
	
	public void calculoColisionTotal(){
		monitorEspacio.calculoColisionTotal();
	}
	
	public void iniciarEscenario(){
		Thread hiloRadar = new Thread(radar);
		Thread hiloServidorT = new Thread(servidorTerrestre);
		Thread hilosistemaBM = new Thread(sistemaBateriaMisiles);
		Thread hiloGeneradorME = new Thread(generadorMisilesEnemigos);
		Thread hiloCollisionDetector = new Thread(collisionDetector);
	
		hiloRadar.start();
		hiloServidorT.start();
		hilosistemaBM.start();
		hiloGeneradorME.start();	
		
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		hiloCollisionDetector.start();
	}
}